/**
 * 菜单服务层
 * 处理菜单相关的业务逻辑
 */
const MenuDao = require('../dao/menu.dao');

// 创建DAO实例
const menuDao = new MenuDao();

class MenuService {
  constructor() {
    // 可以在这里初始化配置或依赖
  }

  /**
   * 获取首页菜单列表
   * @returns {Promise<Array>} 菜单列表
   */
  async getHomeMenus() {
    try {
      // 获取所有启用状态的菜单
      const menus = await menuDao.getActiveMenus();
      
      // 可以在这里进行数据处理或转换
      return menus;
    } catch (error) {
      console.error('获取首页菜单失败:', error);
      throw error;
    }
  }

  /**
   * 根据ID获取菜单详情
   * @param {string} menuId - 菜单ID
   * @returns {Promise<Object>} 菜单详情
   */
  async getMenuDetail(menuId) {
    try {
      const menu = await menuDao.getMenuById(menuId);
      if (!menu) {
        throw new Error('菜单不存在');
      }
      
      // 确保返回的菜单状态是启用的
      if (menu.status !== 1) {
        throw new Error('菜单已禁用');
      }
      
      return menu;
    } catch (error) {
      console.error('获取菜单详情失败:', error);
      throw error;
    }
  }

  /**
   * 创建新菜单（管理员功能）
   * @param {Object} menuData - 菜单数据
   * @returns {Promise<Object>} 创建结果
   */
  async createMenu(menuData) {
    try {
      // 验证必要字段
      if (!menuData.name || !menuData.icon) {
        throw new Error('菜单名称和图标不能为空');
      }
      
      // 设置默认值
      const data = {
        name: menuData.name,
        icon: menuData.icon,
        url: menuData.url || '',
        status: menuData.status !== undefined ? menuData.status : 1,
        sort_order: menuData.sort_order !== undefined ? menuData.sort_order : 0
      };
      
      return await menuDao.createMenu(data);
    } catch (error) {
      console.error('创建菜单失败:', error);
      throw error;
    }
  }

  /**
   * 更新菜单信息（管理员功能）
   * @param {string} menuId - 菜单ID
   * @param {Object} menuData - 菜单数据
   * @returns {Promise<Object>} 更新结果
   */
  async updateMenu(menuId, menuData) {
    try {
      // 验证菜单是否存在
      const existingMenu = await menuDao.getMenuById(menuId);
      if (!existingMenu) {
        throw new Error('菜单不存在');
      }
      
      // 准备更新数据
      const updateData = {};
      if (menuData.name !== undefined) updateData.name = menuData.name;
      if (menuData.icon !== undefined) updateData.icon = menuData.icon;
      if (menuData.url !== undefined) updateData.url = menuData.url;
      if (menuData.status !== undefined) updateData.status = menuData.status;
      if (menuData.sort_order !== undefined) updateData.sort_order = menuData.sort_order;
      
      return await menuDao.updateMenu(menuId, updateData);
    } catch (error) {
      console.error('更新菜单失败:', error);
      throw error;
    }
  }

  /**
   * 删除菜单（管理员功能）
   * @param {string} menuId - 菜单ID
   * @returns {Promise<Object>} 删除结果
   */
  async deleteMenu(menuId) {
    try {
      // 验证菜单是否存在
      const existingMenu = await menuDao.getMenuById(menuId);
      if (!existingMenu) {
        throw new Error('菜单不存在');
      }
      
      return await menuDao.deleteMenu(menuId);
    } catch (error) {
      console.error('删除菜单失败:', error);
      throw error;
    }
  }

  /**
   * 批量更新菜单状态（管理员功能）
   * @param {Array<string>} menuIds - 菜单ID数组
   * @param {number} status - 状态值
   * @returns {Promise<Object>} 更新结果
   */
  async batchUpdateStatus(menuIds, status) {
    try {
      if (!Array.isArray(menuIds) || menuIds.length === 0) {
        throw new Error('请提供有效的菜单ID数组');
      }
      
      if (![0, 1].includes(status)) {
        throw new Error('状态值必须为0或1');
      }
      
      return await menuDao.batchUpdateStatus(menuIds, status);
    } catch (error) {
      console.error('批量更新菜单状态失败:', error);
      throw error;
    }
  }
}

module.exports = MenuService;